package cn.gemiman.daoyi.module.iot.open.jhl;

import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;

import java.security.MessageDigest;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.SortedMap;

/**
 * 签名工具类
 *
 * @author : leo wu
 * @since : 2022-10-19 14:40
 */
public class SignUtils {
    /**
     * 签名算法 sign
     *
     * @param params 参数
     * @return 签名
     */
    public static String createSign(Object params, String appSecret) {
        SortedMap<String, Object> parameters =
                JSON.parseObject(JSONUtil.toJsonStr(params), new TypeReference<>() {
                });
        StringBuilder sb = new StringBuilder();
        Set<Map.Entry<String, Object>> es = parameters.entrySet();//所有参与传参的参数按照 accsii 排序（升序）
        for (Map.Entry<String, Object> entry : es) {
            String k = entry.getKey();
            Object v = entry.getValue();
            if (null != v && !"".equals(v)
                    && !"sign".equals(k) && !"key".equals(k)) {
                sb.append(k).append("=").append(v).append("&");
            }
        }
        sb.append("appSecret=").append(appSecret);
        return Objects.requireNonNull(md5Password(sb.toString())).toUpperCase();
    }

    /**
     * 生成 32 位 md5 码
     *
     * @param key 明文
     * @return 密文
     */
    public static String md5Password(String key) {
        char[] hexDigits = {
                '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B',
                'C', 'D', 'E', 'F'
        };
        try {
            byte[] btInput = key.getBytes();
// 获得 MD5 摘要算法的 MessageDigest 对象
            MessageDigest mdInst = MessageDigest.getInstance("MD5");
// 使用指定的字节更新摘要
            mdInst.update(btInput);
// 获得密文
            byte[] md = mdInst.digest();
// 把密文转换成十六进制的字符串形式
            int j = md.length;
            char[] str = new char[j * 2];
            int k = 0;
            for (byte byte0 : md) {
                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
                str[k++] = hexDigits[byte0 & 0xf];
            }
            return new String(str);
        } catch (Exception e) {
            return null;
        }
    }

    public static void main(String[] args) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("appId", "fxhroyxs61gqbugun9");
        jsonObject.put("timestamp", 1681813857060L);
        jsonObject.put("id", 10324);
        System.out.println(createSign(jsonObject, "oxyskvqiyvonmngpvjodx0stehaa5cv1"));
    }
}
